package cn.wolfcode.trip.api.controller;

import cn.wolfcode.trip.base.domain.Mark;
import cn.wolfcode.trip.base.domain.User;
import cn.wolfcode.trip.base.domain.UserLike;
import cn.wolfcode.trip.base.mapper.UserLikeMapper;
import cn.wolfcode.trip.base.query.*;
import cn.wolfcode.trip.base.service.*;
import cn.wolfcode.trip.base.util.JsonResult;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/users")
public class UserController {

    @Autowired
    private IUserService userSerivce;

    @Autowired
    private ITravelService travelService;
    @Autowired
    private IStrategyCommentService strategyCommentService;

    @Autowired
    private ISigninService signinService;

    @Autowired
    private IMessageService messageService;

    @Autowired
    private IMarkService markService;

    /**
     * 根据状态获取当前用户的通知的数量接口
     * 请求资源 /users/{id}/notices/numbers
     * 请求方式 get
     * 请求参数 state
     * 返回结果 Map
     */
    @GetMapping("/{userId}/notices/{state}/numbers")
    public Map queryNumber(@PathVariable Long userId, @PathVariable Integer state) {
        Map map = new HashMap();
        int number = messageService.queryNumber(userId, state);
        map.put("number", number);
        return map;
    }

    /**
     * 注册用户接口
     * 资源   /users
     * 请求方式 post
     * 请求参数 昵称/邮箱/密码(用户对象接收)
     * 返回结果 JsonResult
     */
    @PostMapping
    public JsonResult register(User user) {
        JsonResult json = new JsonResult();
        try {
            userSerivce.register(user);
        } catch (Exception e) {
            e.printStackTrace();
            json.mark("保存失败");
        }
        return json;
    }

    /**
     * 修改用户信息接口
     * 资源 /users/{id}
     * 请求方式 put
     * 请求参数 user对象
     * 返回结果 JsonResult
     */
    @PutMapping("{id}")
    public JsonResult update(User user) {
        JsonResult json = new JsonResult();
        try {
            userSerivce.update(user);
            json.setData(user);
        } catch (Exception e) {
            e.printStackTrace();
            json.mark(e.getMessage());
        }
        return json;
    }

    /**
     * 获取个人空间信息接口
     * 资源 /users/{id}
     * 请求方式 get
     * 请求参数 Long id
     * 返回结果 JsonResult
     */
    @GetMapping("{id}")
    public JsonResult get(@PathVariable Long id) {
        JsonResult json = new JsonResult();
        try {
            User user = userSerivce.get(id);
            json.setData(user);
        } catch (Exception e) {
            e.printStackTrace();
            json.mark("获取空间信息失败");
        }
        return json;
    }

    /**
     * 获取他人点赞的信息接口
     * 资源 /users/{id}
     * 请求方式 get
     * 请求参数 Long id
     * 返回结果 JsonResult
     */
    @GetMapping("/strategy/CheckGood")
    public PageInfo selectCheckGoodInformation(StrategyCommentCheckGoodQueryObject qo) {
        PageInfo pageInfo = strategyCommentService.selectCheckGoodInformation(qo);
        return pageInfo;
    }


    /**
     * 获取我的游记资源接口
     * 资源  /users/{id}/travels
     * 请求方式 get
     * 请求参数 TravelQuery
     * 返回结果 PageInfo
     */
    @GetMapping("/{authorId}/travels")
    public PageInfo query(TravelQueryObject qo) {
        qo.setOrderBy("t.lastUpdateTime desc"); // 按最后更新时间进行排序
        return travelService.query(qo);
    }


    /**
     * 获取我的点评资源接口
     * 资源  /users/{userId}/strategyComments
     * 请求方式 get
     * 请求参数 strategyCommentlQuery
     * 返回结果 PageInfo
     */
    @GetMapping("/{userId}/strategyComments")
    public PageInfo queryComments(StrategyCommentQueryObject qo){
        qo.setOrderBy("sc.createTime desc");
        return strategyCommentService.query(qo);
    }

    /**
     * 获取JSONResul,判断用户是否点赞过日报
     * 资源  /users/{id}/newses/
     * 请求方式 get
     * 请求参数 TravelQuery
     * 返回结果
     */
    @Autowired
    private UserLikeMapper userLikeMapper;

    @GetMapping("{userId}/userLike/{newsId}")
    public JsonResult getNewsByUserId(@PathVariable Long userId,@PathVariable Long newsId){
        UserLike userLike = userLikeMapper.selectByUserIdAndNewsId(userId, newsId);
        System.out.println(userLike);
        if (userLike!=null){
            return new JsonResult();
        }
        JsonResult result = new JsonResult();
        result.mark("凉了");
        return result;
    }

    //保存用户和日报的关系
    @PostMapping("{userId}/userLike/{newsId}")
    public void insertRelation(UserLike userLike){
        userLikeMapper.insert(userLike);
    }
    /**
     * 删除中间表,用户和日报的关系
     * 资源  /users/{id}/newses/
     * 请求方式 get
     * 请求参数
     * 返回结果
     */
    @DeleteMapping("{userId}/userLike/{newsId}")
    public void deleteRelationByUserIdAndNewsId(@PathVariable Long userId,@PathVariable Long newsId){
        userLikeMapper.deleteRelationByUserIdAndNewsId(userId,newsId);

    }


    /**
     * 关注接口
     * 资源 /users/follow
     * 请求方式 put
     * 请求参数 Long followId,Long fansId
     * 返回结果 void
     */
    @PutMapping("/follow")
    public void follow(Long followId,Long fansId){
        userSerivce.follow(followId,fansId);
    }

    /**
     * 取消关注接口
     * 资源 /users/disFollow
     * 请求方式 delete
     * 请求参数 Long followId,Long fansId
     * 返回结果 void
     */
    @DeleteMapping("/disFollow")
    public void disFollow(Long followId,Long fansId){
        userSerivce.disFollow(followId, fansId);
    }
    /**
     * 查询是否关注接口
     * 资源 /users/checkFollow
     * 请求方式 get
     * 请求参数 Long followId,Long fansId
     * 返回结果 JsonResult
     */
    @GetMapping("/checkFollow")
    public JsonResult checkFollow(Long followId, Long fansId){
        JsonResult json = new JsonResult();
        try {
            userSerivce.checkFollow(followId,fansId);
        } catch (Exception e) {
            e.printStackTrace();
            json.mark("没关注");
        }
        return json;
    }
    /**
     * 查询用户关注列表接口
     * 资源 /users/{id}/follows
     * 请求方式 get
     * 请求参数 FollowQueryObject
     * 返回结果 PageInfo
     */
    @GetMapping("/{targetId}/follows")
    public PageInfo queryFollows(FollowQueryObject qo){
        return userSerivce.queryForFollow(qo);
    }
    /**
     * 查询用户粉丝列表接口
     * 资源 /users/{id}/fans
     * 请求方式 get
     * 请求参数 FollowQueryObject
     * 返回结果 PageInfo
     */
    @GetMapping("/{targetId}/fans")
    public PageInfo queryFans(FollowQueryObject qo){
        return userSerivce.queryForFan(qo);
    }
    /**
     * 查找登录的用户拥有的积分
     * 资源:/users/{id}/mark
     * 请求方式:get
     * 请求参数:用户的id
     * 返回结果:积分对象
     */
    @GetMapping("{id}/mark")
    public Mark selectMarkById(@PathVariable Long id){
       return markService.selectByUserId(id);
    }
    /**
     * 查看购买用户的积分是否大于该商品需要的积分
     * 资源:/users/commodity/{id}/markBuy
     * 请求方式:get
     * 请求参数:
     * 返回结果:JsonResult
     */
    @GetMapping("{id}/markBuy/{commodityId}")
    public JsonResult checkIsBuyByMark(@PathVariable Long id,@PathVariable Long commodityId) {
        JsonResult jsonResult = new JsonResult();        try {
            userSerivce.checkIsBuyByMark(id,commodityId);
        } catch (Exception e) {
            e.printStackTrace();
            jsonResult.mark(e.getMessage());
        }
        return jsonResult;
    }

    /**
     * 查看用户的余额是否大于商品需要的价格
     * 资源:/users/commodity/{id}/moneyBuy
     * 请求方式:get
     * 请求参数:
     * 返回结果:JsonResult
     */
    @GetMapping("{id}/moneyBuy/{commodityId}")
    public JsonResult checkIsBuyByMoney(@PathVariable Long id,@PathVariable Long commodityId) {
        JsonResult jsonResult = new JsonResult();
        try {
            userSerivce.checkIsBuyByMoney(id,commodityId);
        } catch (Exception e) {
            e.printStackTrace();
            jsonResult.mark(e.getMessage());
        }
        return jsonResult;
    }

    /**
     * 根据用户id查询账号余额
     * 资源:/users/id/balance
     * 请求方式:get
     * 请求参数:用户id
     * 返回结果:User
     */
    @GetMapping("{id}/balance")
    public User selectBalance(@PathVariable Long id){
        return userSerivce.selectBalance(id);
    }
    @Autowired
    private ITogetherTripService togetherTripService;
    //我发布的游记
    @GetMapping("{userId}/myTogetherTrips")
    public PageInfo selectTogetherTrips(TogetherTripQueryObject qo){
        qo.setState(true);
        qo.setOrderBy("tt.releaseTime DESC");
        return togetherTripService.query(qo);
    }
    //我报名的结伴
    @GetMapping("{userId}/appTogetherTrips")
    public PageInfo selectAppTogetherTrips(TogetherTripQueryObject qo){
        qo.setState(true);
        qo.setOrderBy("tt.releaseTime DESC");
        return togetherTripService.selectAppTogetherTrips(qo);
    }
    //我关注的结伴
    @GetMapping("{userId}/colTogetherTrips")
    public PageInfo selectColTogetherTrips(TogetherTripQueryObject qo){
        qo.setState(true);
        qo.setOrderBy("tt.releaseTime DESC");
        return togetherTripService.selectColTogetherTrips(qo);
    }
}
